home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 729 / bbbbs / bbbbsdoors53.lzh / rexxDoors / StarTrek.rexx < prev    next >
OS/2 REXX Batch file  |  1991-12-07  |  37KB  |  1,440 lines

  1. /**************************************************************
  2.   **                                                         **
  3.   **  STAR TREK - THE FINAL FRONTIER                         **
  4.   **                                                         **
  5.   **  Written By Steve Berry                                 **
  6.   **                                                         **
  7.   **  Rev A - 4/24/87   IBM 370                              **
  8.   **                                                         **
  9.   **  Rev B - 5/21/88                                        **
  10.   **       modified to run on Amiga                          **
  11.   **                                                         **
  12.   **  Rev C - 10/23/91                                       **
  13.   **       modified to run from CLI or BBBBS                 **
  14.   **       also updated enemy from Klingons to Romulans      **
  15.   **                                                         **
  16.   **  Mods for Atredes by Bob Hassel and Michael Cox         **
  17.   **  ANSI version & other enhancements by Michael Cox       **
  18.   **  BBBBS mods by Richard Lee Stockton                     **
  19.   **                                                         **
  20.   **************************************************************/
  21.  
  22. SIGNAL ON BREAK_C
  23. bbspath=GETCLIP('BBS_path')
  24. PARSE ARG UName .
  25. gamepath=''
  26. IF UName~='' & bbspath~='' THEN gamepath=bbspath'rexxDoors/Data/'
  27. maxtime = 5000
  28. justcleared = 'true'
  29. highest = 0
  30. highname = 0
  31. HOM = 'H'
  32. RESET = ''
  33. POS = '0H'
  34. CLS = 'H'
  35. CLR = ''
  36. CLL = ''
  37. WHITEONBLUE = ''
  38. REDONBLUE = ''
  39. YELLOWONBLUE = ''
  40. CYANONBLACK = ''
  41. YELLOWONBLACK = ''
  42. MAGENTAONBLACK = ''
  43. BLUEONBLACK = ''
  44. REDONYELLOW = ''
  45. WHITE = ''
  46. RED = ''
  47. YELLOW = ''
  48. BLACK = ''
  49. GREEN = ''
  50. CYAN = ''
  51. MAGENTA = ''
  52. BLUE = ''
  53. /*trace all      */
  54.  
  55. call time 'R'           /* reset timer */
  56. do i = 1 to 10
  57.  highscore.i = 0
  58.  highname.i = ' '
  59. end
  60. stardate = time('E')
  61. junk = randu(time('S'))
  62. blanks = '                                 '
  63.  
  64. call old_highest
  65. CALL mess CLS
  66. CALL mess BLUE||'                           Welcome to STARTREK!'
  67. CALL mess
  68. CALL mess YELLOW||'                             TOP TEN PLAYERS'
  69. CALL mess WHITE
  70. do i = 1 to 10
  71.    if highscore.i = 0 then iterate
  72.    CALL mess substr(blanks,1,20) highname.i substr(blanks,1,30-length(highname.i)) RIGHT(highscore.i,6)
  73. end
  74.  
  75. CALL mess CYAN
  76. CALL mess '         (You need an ANSI-compatible terminal to play this game.)'
  77. CALL mess 
  78. OPTIONS PROMPT '               Do you need instructions (y/N)? '
  79. PULL res
  80.  if res = 'Y' then
  81.    call instructions
  82.   else
  83.   do                             /* Anyone ever heard of BRACKETS? */
  84.    CALL mess
  85.    CALL mess 'You can get the instructions at any time by entering the word HELP.'
  86.    OPTIONS PROMPT 'Hit [RETURN] to continue: '
  87.    PULL res
  88.   end
  89. CALL mess CLS
  90. CALL mess 
  91. CALL mess
  92. OPTIONS PROMPT 'Load and play an old game (y/N)? '
  93. PULL fn
  94. CALL mess CLS
  95.  
  96. mission = 1
  97.  
  98. /* Are we playing an OLD Game? */
  99.  
  100. if fn = 'Y' then
  101.     call load_old_game fn
  102. else
  103.  
  104. newmission:
  105.  CALL mess 'Please stand by... universe under construction'
  106.  select
  107.   when mission = 1 then call init_variables_1
  108.   when mission = 2 then call init_variables_2
  109.   when mission = 3 then call init_variables_3
  110.   when mission = 4 then call init_variables_4
  111.   when mission = 5 then call init_variables_5
  112.   when mission = 6 then call init_variables_6
  113.   when mission = 7 then call init_variables_7
  114.   when mission = 8 then call init_variables_8
  115.   when mission = 9 then call init_variables_9
  116.   when mission = 10 then call init_variables_10
  117. /*  otherwise */
  118.  end
  119.  
  120.  
  121. /* ************ */
  122. /* Main do loop */
  123. /* ************ */
  124. starttime = stardate
  125. CALL mess CLS
  126. do until energy = 0
  127.  
  128. CALL mess HOM
  129.  call print_quadrent x,y,ex,ey
  130.  t0 = time('R')
  131.  
  132. /* get user input and parse the commands */
  133.  if stardate - starttime > maxtime then call toolong
  134.  OPTIONS PROMPT 'Your command, Captain? '
  135.  PULL instring
  136.  rc = parse_command(instring)
  137.  
  138. /* process the commands */
  139.  
  140.   if rc = 0 then do
  141.     do loop = 1 to 3
  142.      if arg1.loop = '' then leave
  143.      call process_command arg1.loop,arg2.loop
  144.      if alive = 'no' | energy <= 0 then leave
  145.     end
  146.    end
  147.   else CALL mess "Command not understood. Enter HELP for reminder."
  148.  
  149. /* Check for illegal input */
  150.  
  151.   if missstat = 'completed' then do
  152.     CALL mess CLS
  153.     CALL mess
  154.     CALL mess ' CONGRATULATIONS !!! You have completed the mission!'
  155.     CALL mess
  156.      exit 0
  157.     end
  158.  
  159. /* Did player kill himself? */
  160.  
  161.  If alive = 'no' | energy <= 0 then do
  162.    CALL mess CLS
  163.    CALL mess
  164.    CALL mess
  165.    CALL mess
  166.    CALL mess
  167.    CALL mess ' Suicide is not in the BEST interests of the FEDERATION.'
  168.    CALL mess
  169.    CALL mess ' But you did get 'points' points.'
  170.    CALL mess
  171.    CALL mess
  172.    CALL mess
  173.    CALL mess 'Game over.'
  174.    CALL mess
  175.    CALL mess
  176.    exit
  177.   end
  178.  
  179. /* Time for a little wear and tear on the enterprize */
  180.  
  181.  call wear_and_tear
  182.  
  183. /* Is the Enterprize DEAD in Space? */
  184.  
  185.  If alive = 'no' then do
  186.    CALL mess CLS
  187.    CALL mess
  188.    CALL mess
  189.    CALL mess
  190.    CALL mess
  191.    CALL mess ' Sorry but you let the Enterprise deteriorate into '
  192.    CALL mess ' into a rusting hunk of space debris.'
  193.    CALL mess
  194.    CALL mess ' But you did get 'points' points.'
  195.    CALL mess
  196.    CALL mess
  197.    CALL mess
  198.    CALL mess 'Game over.'
  199.    CALL mess
  200.    CALL mess
  201.    exit
  202.   end
  203.  
  204. /* Ok. now it's the Bad guy's turn */
  205.  
  206. /* now call mission specific routine */
  207. /* for bad guy routine and points awarded */
  208.  
  209.  select
  210.   when mission = 1 then call mission1
  211.   when mission = 2 then call mission2
  212.   when mission = 3 then call mission3
  213.   when mission = 4 then call mission4
  214.   when mission = 5 then call mission5
  215.   when mission = 6 then call mission6
  216.   when mission = 7 then call mission7
  217.   when mission = 8 then call mission8
  218.   when mission = 9 then call mission9
  219.   when mission = 10 then call mission10
  220.  end
  221.  
  222. /* Is the Enterprize KILLED? KRUSHED? DESTROYED? */
  223.  
  224.  If alive = 'no' then do
  225.    CALL mess
  226.    CALL mess
  227.    CALL mess
  228.    CALL mess
  229.    CALL mess ' Sorry but you let your crew and the Federation down.'
  230.    CALL mess ' Perhaps you should consider another career.'
  231.    CALL mess
  232.    CALL mess ' But you did get 'points' points.'
  233.    CALL mess
  234.    CALL mess
  235.    CALL mess
  236.    CALL mess 'Game over.'
  237.    CALL mess
  238.    CALL mess
  239.    exit
  240.   end
  241.  
  242. /* end of the loop - now go print the screen */
  243. end
  244.  
  245.  
  246. /* ********************************************** */
  247. /* ********************************************** */
  248. /*          SUBROUTINE SECTION                    */
  249. /* ********************************************** */
  250. /* ********************************************** */
  251.  
  252.  
  253.  
  254. /* ********************************************** */
  255. /* ********************************************** */
  256. /*          SUBROUTINE LOAD_OLD_GAME              */
  257. /*  PASSED VALUES - fn                            */
  258. /* ********************************************** */
  259. /* ********************************************** */
  260.  
  261. load_old_game:
  262.  
  263.  
  264. bstr = '   |o| * <->(B))\_ # '
  265. missstat = 'not yet'
  266. CALL mess 'Loading your previously saved game...'
  267. /* get variables */
  268.  if ~Open(fnn,gamepath||UName,'R') then
  269.  
  270. do
  271. CALL mess "Can't find a saved game for you! Exiting STARTREK."
  272. exit
  273. end
  274.  inn = Readln(fnn)
  275.  parse var inn stardate mission energy points x y ex ey shields klshields docked kltot
  276.  inn = Readln(fnn)
  277.  parse var inn status.0 status.1 status.2 status.3 status.4 status.5
  278.  
  279. /* start interval timer */
  280.  
  281. stardate = stardate + time('E')
  282.  
  283. /* Load galactic map */
  284.  
  285.  do l = 0 to 9
  286.   inn1 = Readln(fnn)
  287.   parse var inn1 map.l.0 map.l.1 map.l.2 map.l.3 map.l.4 map.l.5 map.l.6 map.l.7 map.l.8 map.l.9
  288.   
  289.  end
  290.  
  291.  do l = 0 to 9
  292.   inn1 = Readln(fnn)
  293.   parse var inn1 quad.l.0 quad.l.1 quad.l.2 quad.l.3 quad.l.4 quad.l.5 quad.l.6 quad.l.7 quad.l.8 quad.l.9
  294.  end
  295. alive = 'yes'
  296. junk = Close(fnn)
  297. call newscreen
  298. return
  299.  
  300. /* ********************************************** */
  301. /* ********************************************** */
  302. /*          SUBROUTINE INIT_VARIABLES_1           */
  303. /*  PASSED VALUES - none                          */
  304. /* ********************************************** */
  305. /* ********************************************** */
  306.  
  307. init_variables_1:
  308.  
  309. bstr = '   |o| * <->(B))\_ # '
  310. alive = 'yes'
  311. energy = 1000000
  312. x = 0
  313. y = 0
  314. points = 0
  315. mission = 1
  316. shields = 'down'
  317. kltot = 0
  318. missstat = 'not yet'
  319.  
  320. do a = 0 to 9
  321.  do b = 0 to 9
  322.    map.a.b = random(0,1) * 100 + random(0,1)*10 + random(0,9)
  323.    if map.a.b > 99 then kltot = kltot + 1
  324.  end
  325. end
  326.  
  327. klshields = 5000
  328. status.0 = 0
  329. status.1 = 0
  330. status.2 = 0
  331. status.3 = 0
  332. status.4 = 0
  333. status.5 = 0
  334. ex = 5
  335. ey = 4
  336.  
  337.  
  338. newscreen:
  339. /* initialize quadrent matrix */
  340.  
  341. enemies = map.x.y%100
  342. bases = (map.x.y - enemies * 100)%10
  343. stars = map.x.y - enemies * 100 - bases * 10
  344.  
  345. /* zero quad matrix */
  346.  
  347. do i = 0 to 9
  348.  do j = 0 to 9
  349.   quad.i.j = 0
  350.  end
  351. end
  352.  
  353. /* locate the enterprize */
  354.  
  355. quad.ex.ey = 1
  356.  
  357. /* put the stars in */
  358.  
  359. do a = 0 to stars - 1
  360.  rx = random(0,9)
  361.  ry = random(0,9)
  362.  if quad.rx.ry = 0 then quad.rx.ry = 2
  363.  else a=a-1
  364. end
  365.  
  366. /* enemies? */
  367.  
  368. if enemies ~= 0 then do
  369.  do a = 0 to enemies - 1
  370.    rx = random(0,9)
  371.    ry = random(0,9)
  372.    if quad.rx.ry = 0 then quad.rx.ry = 3
  373.    else a=a-1
  374.  end
  375. end
  376. /* bases ? */
  377.  
  378. if bases ~= 0 then do
  379.  do a = 0 to bases - 1
  380.    rx = random(0,9)
  381.    ry = random(0,9)
  382.    if quad.rx.ry = 0 then quad.rx.ry = 4
  383.    else a=a-1
  384.  end
  385. end
  386. docked = 'no'
  387.  
  388. return
  389.  
  390. /* ********************************************** */
  391. /* ********************************************** */
  392. /*          SUBROUTINE PRINT_QUARDENT             */
  393. /*  PASSED VALUES - x, y ,ex ,ey                  */
  394. /* ********************************************** */
  395. /* ********************************************** */
  396.  
  397. print_quadrent:
  398.  
  399. call dock?  /* check to see if the Enterprize is docked */
  400.  
  401. stardate = stardate + time('E')
  402.  
  403. if status.5 < 1 | docked = 'yes' then astr = bstr
  404. else   astr = 'XXX|o|XXXXXXXXXXXXXXX'
  405. /*if justcleared = 'true' then CALL mess RESET||'         '||WHITEONBLUE||' ------------------------------ '||RESET||'                    '
  406.   else CALL mess RESET */
  407.   CALL mess RESET
  408. do i0 = 0 to 9
  409.  line = '         '|| WHITEONBLUE
  410.  do j0 = 0 to 9
  411.   select
  412.     when quad.i0.j0 = 0 then line = line || substr(astr,quad.i0.j0 * 3 + 1,3)
  413.     when quad.i0.j0 = 1 then line = line || WHITE || substr(astr,quad.i0.j0 * 3 + 1,3)
  414.     when quad.i0.j0 = 2 then line = line || YELLOW || substr(astr,quad.i0.j0 * 3 + 1,3)||WHITE
  415.     when quad.i0.j0 = 3 then line = line || RED || substr(astr,quad.i0.j0 * 3 + 1,3)||WHITE
  416.     when quad.i0.j0 = 4 then line = line || GREEN || substr(astr,quad.i0.j0 * 3 + 1,3)||WHITE
  417.     when quad.i0.j0 = 5 then line = line || CYAN || substr(astr,quad.i0.j0 * 3 + 1,3)||WHITE
  418.     when quad.i0.j0 = 6 then line = line || MAGENTA || substr(astr,quad.i0.j0 * 3 + 1,3)||WHITE
  419.   otherwise nop
  420.   end
  421.  end
  422.  select
  423.   when i0 = 0 then line = line || YELLOWONBLACK ||'  Stardate: 'stardate'    '
  424.   when i0 = 1 then
  425.   do
  426.    if energy > 10000 then line = line || YELLOWONBLACK ||'  Energy: 'energy'    '
  427.    else
  428.    line = line || YELLOWONBLACK ||'  Energy: '||REDONYELLOW||energy'    '
  429.   end
  430.   when i0 = 2 then line = line || YELLOWONBLACK ||'  Quadrant:' y',' x'    '
  431.   when i0 = 3 then line = line || YELLOWONBLACK ||'  Sector:  ' ex',' ey '  '
  432.   when i0 = 4 & docked = 'yes' then line = line || YELLOWONBLACK || '  Condition: '||GREEN||'DOCKED'
  433.   when i0 = 4 & map.x.y > 99 & docked = 'no' then line = line || YELLOWONBLACK ||'  Condition: '||RED||'RED    '
  434.   when i0 = 4 & map.x.y < 100 & docked = 'no' then line = line || YELLOWONBLACK || '  Condition: '||GREEN||'Green    '
  435.   when i0 = 5 then
  436.  
  437.    do
  438.     if shields = 'UP' then line = line || YELLOWONBLACK ||'  Shields:' CYANONBLACK||'Up    '
  439.     else
  440.     line = line || YELLOWONBLACK ||'  Shields:' MAGENTAONBLACK||'Down    '
  441.    end
  442. /*  when i0 = 6 then line = line || YELLOWONBLACK ||'  Mission:' mission'    ' */
  443.   when i0 = 6 then line = line || YELLOWONBLACK ||'  Romulans left:' kltot'    '
  444.   when i0 = 7 then line = line || YELLOWONBLACK ||'  Points:' points'    '
  445.   otherwise line = line || RESET||'                       '
  446.  end
  447.  if (line ~= oldline.i0)|(justcleared = 'true') then CALL mess line; else CALL mess ""
  448.  oldline.i0 = line
  449. end
  450. /* if justcleared = 'true' then CALL mess      '||WHITEONBLUE||' ------------------------------ '||RESET||'                     '
  451. else CALL mess RESET */
  452. CALL mess RESET
  453. call clearbottom
  454. justcleared = 'false'
  455. return
  456.  
  457. /* ********************************************** */
  458. /* ********************************************** */
  459. /*           SUBROUTINE PARSE_COMMAND             */
  460. /*  PASSED VALUES - INSTRING                      */
  461. /* ********************************************** */
  462. /* ********************************************** */
  463.  
  464. parse_command:
  465.  
  466. parse arg arg1.1 arg2.1 arg1.2 arg2.2 arg1.3 arg2.3 .
  467.  
  468. /* string for recognition of commands */
  469.  
  470. comstr = 'COMFIRTORPHADISMAPSHOSENLONRAILOWSHIWARIMPLAUPROCAPLOGTRASHIDOWSAVGAMINSQUIDRISTAHELPOWSCASEE'
  471.  
  472. /* Check for no input */
  473.  
  474. if arg1.1 = '' then return -1
  475. if arg1.1 = '#' then
  476.   do
  477.   exit
  478.   end
  479.  
  480. /* trash all but the first three letters of each command */
  481.  
  482. do i = 1 to 3
  483.  arg1.i = left(arg1.i,3)
  484.  arg2.i = left(arg2.i,3)
  485.  if arg1.i = '' then leave
  486.  do j = 0 to 30
  487.   if arg1.i = substr(comstr,j * 3 + 1,3) then leave
  488.  end
  489.  if j > 30  then return -1
  490.  if arg2.i = '' then return 0
  491.   do j = 0 to 30
  492.    if arg2.i = substr(comstr,j * 3 + 1,3) then leave
  493.   end
  494.  if j > 30  then return -1
  495. end
  496.  
  497. return 0
  498.  
  499. /* ********************************************** */
  500. /* ********************************************** */
  501. /*           SUBROUTINE PROCESS_COMMAND           */
  502. /*  PASSED VALUES - word1 , word2                 */
  503. /* ********************************************** */
  504. /* ********************************************** */
  505.  
  506. process_command:
  507.  
  508. arg word1,word2
  509. select
  510.   when word1 = 'FIR' then call weapon_control word2
  511.   when word1 = 'COM' then call compute word2
  512.   when word2 = 'SEN' then call sensors word1
  513.   when word2 = 'SCA' then call sensors word1
  514.   when word1 = 'SEN' then call sensors word1
  515.   when word1 = 'SCA' then call sensors word1
  516.   when word2 = 'SHI' then call shield_control word1
  517.   when word2 = 'DRI' then call engine_control word1
  518.   when word2 = 'POW' then call engine_control word1
  519.   when word1 = 'INS' then call instructions
  520.   when word2 = 'INS' then call instructions
  521.   when word1 = 'HEL' then call instructions
  522.   when word1 = 'SAV' then call save_game word2
  523.   when word1 = 'DIS' then call display_info word2
  524.   when word1 = 'SEE' then call display_info word2
  525.   when word1 = 'STA' then call display_info word2
  526.   when word1 = 'LAU' then call launch_probe word2
  527.   when word1 = 'CAP' then call captains_log word2
  528.   when word1 = 'QUI' then
  529.   do
  530.   call new_highest
  531.   CALL mess 'Exiting STARTREK... play again soon!'
  532. exit
  533.   end
  534.   otherwise CALL mess 'Sorry - not understood'
  535. end
  536.  
  537. return
  538.  
  539. /* ********************************************** */
  540. /* ********************************************** */
  541. /*           SUBROUTINE WEAPON_CONTROL            */
  542. /*  PASSED VALUES - weapon                        */
  543. /* ********************************************** */
  544. /* ********************************************** */
  545.  
  546. weapon_control:
  547.  
  548. arg weapon
  549.  
  550. if (weapon ~= 'PHA') & (weapon ~= 'TOR') then do
  551.    CALL mess
  552.    CALL mess 'Weapon does not exist.'
  553.    return
  554.   end
  555.  
  556. /* Phasers section */
  557.  
  558. if weapon = 'PHA' then do
  559.   if map.x.y < 100 then do
  560.     CALL mess 'No targets to fire on.   '
  561.     return
  562.    end
  563.  
  564.  /* compute the distance  between Enterprize and Romulan */
  565.  
  566.  kx = 0
  567.  ky = 0
  568.  do i = 0 to 9
  569.   do j = 0 to 9
  570.    if quad.i.j = 3 then do
  571.      kx = i
  572.      ky = j
  573.     end
  574.   end
  575.  end
  576. /* compute the distance (rough approximation) */
  577.  distance = ((ex-kx)**2 + (ey-ky)**2)
  578.  do i = 1 to 13 by .5
  579.   t0 = distance/i
  580.   if t0 < i then leave
  581.  end
  582.  distance = i
  583.  energy = energy - 5000
  584.  hit = (1 - status.1)* 5000 - (distance * 500)
  585.  if hit < 0 then hit = 0
  586.  klshields = klshields - hit
  587.  CALL mess
  588.  CALL mess 'PHASERS LOCKED ON TARGET '
  589.  CALL mess 'Phasers fired -'
  590.  if klshields <= 0 then do
  591.     CALL mess 'ROMULAN HIT WITH' hit ' units of energy'
  592.     CALL mess '*** ROMULAN DESTROYED! ***'
  593.     points = points + 50
  594.     klshields = 5000
  595.     quad.kx.ky = 0
  596.     map.x.y = map.x.y - 100
  597.     kltot = kltot - 1
  598.    end
  599.  else
  600.    do
  601.     CALL mess 'KILINGON HIT WITH' hit ' units of energy'
  602.     CALL mess 'The Romulan ship is still alive, Captain!'
  603.    end
  604.  end /* end of phaser routine */
  605. else
  606.   /* Torpedo routine */
  607.     do
  608.      CALL mess 'Torpedos ready Captain.'
  609.      do until c = 0
  610.       OPTIONS PROMPT 'X vector, Captain (-1 = left, 0 = middle, 1 = right)? '
  611.       PULL dy
  612.       OPTIONS PROMPT 'Y vector, Captain (-1 = up, 0 = middle, 1 = down)? '
  613.       PULL dx
  614.       if dx = '' then dx = 0
  615.       if dy = '' then dy = 0
  616.       if (dx = -1 | dx = 0 | dx = 1) & (dy = -1|dy = 0|dy = 1) then c = 0
  617.       else
  618.        do
  619.         c = 1
  620.         CALL mess 'Invalid vectors. Valid range for each is -1 to 1.'
  621.        end
  622.      end
  623.     tx = ex
  624.     ty = ey
  625.     do lp = 0 to 9
  626.      t0 = tx+dx
  627.      t1 = ty+dy
  628.      if (t0 < 0) | (t0 > 9) | (t1 < 0) | (t1 > 9) then do
  629.        CALL mess ' Torpedo missed!'
  630.        return
  631.       end
  632.      space = quad.t0.t1
  633.      if space ~= 0 then select
  634.        when space = 2 then do
  635.          CALL mess '*** Torpedo hits a STAR ***'
  636.          return
  637.         end
  638.        when space = 3 then do
  639.          CALL mess '*** Torpedo hits a ROMULAN ***'
  640.          CALL mess '*** ROMULAN DESTROYED ***'
  641.          CALL mess 'Good shot, Captain!'
  642.          quad.t0.t1 = 0
  643.          map.x.y = map.x.y - 100
  644.          kltot = kltot - 1
  645.          points = points + 100
  646.          return
  647.         end
  648.        when space = 4 then do
  649.          CALL mess '*** Torpedo hits a BASE ***'
  650.          CALL mess 'COURT MARTIAL IS IMMINENT!'
  651.          return
  652.         end
  653.        otherwise do
  654.          CALL mess '*** Torpedo hits the DEATHSTAR ***'
  655.          CALL mess 'Torpedo seems to have no effect!'
  656.          return
  657.         end
  658.        end
  659.       quad.t0.t1 = 6
  660.       tx = t0
  661.       ty = t1
  662. CALL mess HOM
  663.       call print_quadrent
  664.       quad.tx.ty = 0
  665.      end
  666.     end
  667. return
  668.  
  669. /* ********************************************** */
  670. /* ********************************************** */
  671. /*           SUBROUTINE WEAR_AND_TEAR             */
  672. /*  PASSED VALUES - none                          */
  673. /* ********************************************** */
  674. /* ********************************************** */
  675.  
  676. wear_and_tear:
  677.  
  678. pick = random(0,5)
  679. if docked = 'yes' then
  680.  if status.pick = 0 then return
  681.  else status.pick = status.pick - .1
  682. else if status.pick < 1 then do
  683.   status.pick = status.pick + .1
  684.   if status.pick = 1 then do
  685.     CALL mess 'Status report sir -'
  686.     select
  687.      when pick = 0 then CALL mess 'Computer is in need of repair!'
  688.      when pick = 1 then CALL mess 'Phasers are in need of repair!'
  689.      when pick = 2 then CALL mess 'Torpedos are in need of repair!'
  690.      when pick = 3 then CALL mess 'Warp Drive is in need of repair!'
  691.      when pick = 4 then CALL mess 'Impulse Drive is in need of repair!'
  692.      when pick = 5 then CALL mess 'Sensors are out of order!'
  693.     end
  694.    if status.3 > .9 & status.4 > .9 then do
  695.      CALL mess 'Captain sir ... we seem to be dead in space!'
  696.      CALL mess 'The warp drive and the impulse drive are out!'
  697.      alive = 'no'
  698.     end
  699.   end
  700.  end
  701. return
  702.  
  703.  
  704. /* ********************************************** */
  705. /* ********************************************** */
  706. /*           SUBROUTINE engine_control            */
  707. /*  PASSED VALUES - power                         */
  708. /* ********************************************** */
  709. /* ********************************************** */
  710.  
  711. engine_control:
  712.  
  713. arg power
  714.  
  715. CALL mess 'Scotty here captain.'
  716. if power = 'WAR' then do
  717.   if status.3 > 1.2 then
  718.   do
  719.   CALL mess 'Sorry Captain, warp drive is out of commission!'
  720.   return
  721.   end
  722.   OPTIONS PROMPT 'What Warp factor Captain? '
  723.   PULL warp
  724.   if warp = '' then warp = 0
  725.   do forever
  726.    OPTIONS PROMPT 'Destination X vector (0-9)? '
  727.    PULL dy
  728.    OPTIONS PROMPT 'Destination Y vector (0-9)? '
  729.    PULL dx
  730.    if datatype(dx,'W') & datatype(dy,'W') then leave
  731.    CALL mess 'Where?'
  732.   end
  733.    if x > 9 | y < 0 | x  < 0 | y > 9 then do
  734.     energy = energy - 5000
  735.     CALL mess 'Captain, the warp drive is in a bad way'
  736.     CALL mess 'and we are losing energy fast!'
  737.    end
  738.  /* if warp drive damaged degrade efficiency of energy consumption */
  739.   energy = energy - ((((dx-x)**2 + (dy-y)**2)/2.5)*1000+status.3*5000)
  740.   if dx > 9 | dy < 0 | dx < 0 | dy > 9 then do
  741.      CALL mess
  742.      CALL mess 'Warping out of the galaxy is not a good idea. Range 0-9 please.'
  743.      CALL mess
  744.      if shields = 'down' then do
  745.         CALL mess ' SHIELDS are DOWN --- the ENTERPRISE is caught, in the void of intergalatic space'
  746.         CALL mess ' Damage control report - WARP drive damaged, Impulse drive damaged, sensors out!'
  747.         status.3 = status.3 + 1
  748.         status.4 = status.4 + 1
  749.         status.5 = 1.1
  750.       end
  751.      else energy = energy - 5000
  752.     end
  753.   x = dx
  754.   y = dy
  755.   if x > -1 & x < 10 & y > -1 & y < 10 then call newscreen
  756.   end
  757.  else
  758.   do
  759.    if power ~= 'IMP' | status.4 > .9 then do
  760.      CALL mess 'Sorry Captain, impulse power is out of commission!'
  761.      return
  762.     end
  763.    else
  764.     do
  765.      CALL mess 'Aye Captain - Impulse power it is'
  766.      OPTIONS PROMPT 'What factor, Captain? '
  767.      do forever      
  768.        PULL factor
  769.        if datatype(factor,'W') then leave
  770.        CALL mess 'Whats that, Captain? '
  771.      end
  772.      if factor <= 0 & num = 'yes' then return
  773.      do until c = 0
  774.       OPTIONS PROMPT ' X vector (-1 = left, 0 = middle, 1 = right)? '
  775.       PULL dy
  776.       OPTIONS PROMPT ' Y vector (-1 = up, 0 = middle, 1 = down)? '
  777.       PULL dx
  778.       if dx = '' then dx = 0
  779.       if dy = '' then dy = 0
  780.       if (dx = -1 | dx = 0 | dx = 1) & (dy = -1|dy = 0|dy = 1) then c = 0
  781.       else
  782.        do
  783.         c = 1
  784.         CALL mess 'Invalid vectors - valid range for each is -1 to 1.'
  785.        end
  786.      end
  787.     do i = 0 to factor - 1
  788.      if ((ex+dx) < 0) | ((ex+dx) > 9) | ((ey+dy) < 0) |((ey+dy) > 9) then
  789.       do
  790.        CALL mess ' You have to use the Warp drive to exit the quadrant.'
  791.        return
  792.       end
  793.      t0 = ex+dx
  794.      t1 = ey+dy
  795.      space = quad.t0.t1
  796.      if space ~= 0 then select
  797.        when space = 2 then do
  798.          CALL mess '*** COLLISION with STAR ***'
  799.          alive = 'no'
  800.         end
  801.        when space = 3 then do
  802.          CALL mess '*** COLLISION with ROMULAN ***'
  803.          alive = 'no'
  804.         end
  805.        when space = 4 then do
  806.          CALL mess '*** COLLISION with BASE ***'
  807.          alive = 'no'
  808.         end
  809.        otherwise do
  810.          CALL mess '*** SWALLOWED BY THE DEATHSTAR ***'
  811.          alive = 'no'
  812.         end
  813.        end
  814.       quad.ex.ey = 0
  815.       quad.t0.t1 = 1
  816.       ex = t0
  817.       ey = t1
  818.       if alive = 'yes' then do
  819.         CALL mess HOM
  820.         call print_quadrent
  821.       end
  822.      end
  823.     end
  824.    end
  825.  
  826. /* Got to check to see if Enterprize is docked */
  827. dock?:
  828.  
  829. docked = 'no'
  830. do i1 = -1 to 1
  831.  do j1 = -1 to 1
  832.   if i1+ex > -1 & i1+ex < 10 & j1+ey > -1 & j1+ey < 10 then do
  833.     ta = i1+ex
  834.     tb = j1+ey
  835.     if quad.ta.tb = 4 then do
  836.  
  837.      docked = 'yes'
  838.      t = status.0 + status.1 + status.2 + status.3 + status.4 + status.5
  839.      stardate = stardate + t
  840.      status.0 = 0
  841.      status.1 = 0
  842.      status.2 = 0
  843.      status.3 = 0
  844.      status.4 = 0
  845.      status.5 = 0
  846.     end
  847.    end
  848.  end
  849. end
  850. if kltot = 0 then missstat = 'completed'
  851.  
  852. return
  853.  
  854. /* ********************************************** */
  855. /* ********************************************** */
  856. /*           SUBROUTINE SAVE_GAME                 */
  857. /*  PASSED VALUES - filename                      */
  858. /* ********************************************** */
  859. /* ********************************************** */
  860.  
  861. save_game:
  862.  
  863.  
  864.  
  865. missstat = 'not yet'
  866.  
  867. /* save variables */
  868.  
  869.  
  870.  if ~Open(fnn,gamepath||UName,'W') then do
  871.   CALL mess '***Open return code = ' rc 'on 'bbspath'rexxDoors/Data/'||UName
  872.   CALL mess 'File may be in use, or is unable to be opened. Try again.'
  873.   return
  874.  end
  875. CALL mess 'Storing your game...'
  876. if Writeln(fnn,stardate mission energy points x y ex ey shields klshields docked kltot) < 1 then
  877.  do
  878. exit
  879. end
  880. if Writeln(fnn, status.0 status.1 status.2 status.3 status.4 status.5) < 1 then
  881.  do
  882. exit
  883. end
  884.  
  885. /* Save galactic map */
  886.  
  887.  do l = 0 to 9
  888.   if Writeln(fnn,map.l.0 map.l.1 map.l.2 map.l.3 map.l.4 map.l.5 map.l.6 map.l.7 map.l.8 map.l.9) < 1 then
  889.   do
  890.     exit
  891.   end
  892.  end
  893.  
  894.  do l = 0 to 9
  895. if Writeln(fnn,quad.l.0 quad.l.1 quad.l.2 quad.l.3 quad.l.4 quad.l.5 quad.l.6 quad.l.7 quad.l.8 quad.l.9) < 1 then
  896.   do
  897.   exit
  898.   end
  899.  end
  900.  if ~Close(fnn) then
  901.   do
  902. exit
  903. end
  904. return
  905.  
  906. /* ********************************************** */
  907. /* ********************************************** */
  908. /*           SUBROUTINE SENSORS                   */
  909. /*  PASSED VALUES - type                          */
  910. /* ********************************************** */
  911. /* ********************************************** */
  912.  
  913. sensors:
  914.  
  915. arg type
  916.  
  917. if status.5 < 1.1 then do
  918.   do i = -1 to 1
  919.    CALL mess '-------------------'
  920.    line = ': '
  921.    do j = -1 to 1
  922.      t0 = x+i
  923.      t1 = y+j
  924.      if t0 < 0 | t0 > 9 | t1 < 0 | t1 > 9 then line = line || 'XXX :'
  925.      else
  926.       do
  927.        if map.t0.t1 < 100 & map.t0.t1 > 9 then line = line || ' '
  928.        if map.t0.t1 < 10 then line = line || '  '
  929.        line = line || map.t0.t1 || ' :'
  930.       end
  931.    end
  932.    CALL mess line
  933.   end
  934. end
  935. else
  936.   if status.5 > 1 then do
  937.     CALL mess ' Long-range sensors are out, captain!'
  938.     CALL mess
  939.   end
  940.  CALL mess '-------------------'
  941.  CALL mess
  942.  OPTIONS PROMPT 'Hit RETURN to resume: '
  943.  PULL res
  944.  call clearbottom
  945. return
  946.  
  947.  
  948. /* ********************************************** */
  949. /* ********************************************** */
  950. /*           SUBROUTINE SHIELD_CONTROL            */
  951. /*  PASSED VALUES - direction                     */
  952. /* ********************************************** */
  953. /* ********************************************** */
  954.  
  955. shield_control:
  956.  
  957. arg direction
  958.  
  959. if direction = 'RAI' then
  960.  if shields = 'UP' then do
  961.    CALL mess 'Shields are already up.'
  962.   end
  963.  else
  964.   do
  965.    shields = 'UP'
  966.    CALL mess 'Shields up, Captain.'
  967.    energy = energy - 3000
  968.   end
  969. else
  970.  if direction = 'LOW' then
  971.   if shields = 'down' then do
  972.     CALL mess 'Shields are already down.'
  973.    end
  974.   else
  975.    do
  976.     shields = 'down'
  977.     CALL mess 'Shields down, Captain.'
  978.     energy = energy + 3000
  979.    end
  980.  else
  981.   do
  982.    CALL mess ' I am confused by that order, Captain.'
  983.    return
  984.   end
  985. return
  986.  
  987. /* ********************************************** */
  988. /* ********************************************** */
  989. /*           SUBROUTINE DISPLAY_INFO              */
  990. /*  PASSED VALUES - what                          */
  991. /* ********************************************** */
  992. /* ********************************************** */
  993.  
  994. display_info:
  995.  
  996. arg what
  997.  
  998.   CALL mess CLS
  999.   CALL mess
  1000.   CALL mess ' Status report for Enterprise - Stardate ' stardate
  1001.   CALL mess ' ----------------------------------'
  1002.   c = 100 - status.0*100
  1003.   CALL mess ' Computer      status ' c'%'
  1004.   CALL mess ' ----------------------------------'
  1005.   c = 100 - status.1*100
  1006.   CALL mess ' Phasers       status ' c'%'
  1007.   CALL mess ' ----------------------------------'
  1008.   c = 100 - status.2*100
  1009.   CALL mess ' Torpedos      status ' c'%'
  1010.   CALL mess ' ----------------------------------'
  1011.   c = 100 - status.3*100
  1012.   CALL mess ' Warp drive    status ' c'%'
  1013.   CALL mess ' ----------------------------------'
  1014.   c = 100 - status.4*100
  1015.   CALL mess ' Impulse drive status ' c'%'
  1016.   CALL mess ' ----------------------------------'
  1017.   c = 100 - status.5*100
  1018.   CALL mess ' Sensors       status ' c'%'
  1019.   CALL mess ' ----------------------------------'
  1020.   OPTIONS PROMPT 'Hit RETURN to resume: '
  1021.   PULL res
  1022. CALL mess CLS
  1023. justcleared = 'true'
  1024. return
  1025.  
  1026. /* ********************************************** */
  1027. /* ********************************************** */
  1028. /*           SUBROUTINE INSTRUCTIONS              */
  1029. /*  PASSED VALUES - none                          */
  1030. /* ********************************************** */
  1031. /* ********************************************** */
  1032.  
  1033. instructions:
  1034.  
  1035. CALL mess CLS
  1036. CALL mess 'Welcome to STARTREK.'
  1037. CALL mess
  1038. CALL mess 'This version of STARTREK is very simple and has been heavily'
  1039. CALL mess 'modified for better playability. The universe consists of a 10 by 10'
  1040. CALL mess 'grid of quadrants, each quadrant also consisting of a 10 by 10 grid.'
  1041. CALL mess '0,0 is the top left corner; Y is vertical and X is horizontal.'
  1042. CALL mess
  1043. CALL mess 'The object is to destroy all the Romulan ships in the galaxy.'
  1044. CALL mess
  1045. CALL mess 'You will see several objects as you play; the most common ones are:'
  1046. CALL mess
  1047. CALL mess '   |o| = the Enterprise'
  1048. CALL mess '   <-> = Romulans'
  1049. CALL mess '   (B) = a Starbase'
  1050. CALL mess '    *  = a star'
  1051. CALL mess
  1052. OPTIONS PROMPT 'Hit [RETURN] to continue: '
  1053. PULL res
  1054. CALL mess CLS
  1055. CALL mess 'COMMANDS'
  1056. CALL mess
  1057. CALL mess 'The command line takes two-word combinations. You can abbreviate'
  1058. CALL mess 'words to 3 letters. The most common commands are'
  1059. CALL mess
  1060. CALL mess '   RAISE SHIELDS (hint!)'
  1061. CALL mess '   LOWER SHIELDS'
  1062. CALL mess '   FIRE PHASERS'
  1063. CALL mess '   FIRE TORPEDOS'
  1064. CALL mess '   IMPULSE POWER'
  1065. CALL mess '   WARP DRIVE'
  1066. CALL mess '   SCANNERS (or SENSORS)'
  1067. CALL mess '   STATUS'
  1068. CALL mess '   SAVE (Saves game WITHOUT exiting)'
  1069. CALL mess '   QUIT (Exit game entirely)'
  1070. CALL mess '   HELP (Gives you this file again)'
  1071. CALL mess
  1072. OPTIONS PROMPT 'Hit [RETURN] to continue: '
  1073. PULL res
  1074. CALL mess CLS
  1075. CALL mess 'VECTORS: When firing torpedoes or moving the ship you are asked'
  1076. CALL mess 'for X and Y vectors. Each of these can be -1, 0, or 1. This'
  1077. CALL mess 'indicates the X or Y direction. For instance, if X = 0 and Y = 1,'
  1078. CALL mess 'this indicates a vector straight down. If both are -1, this would'
  1079. CALL mess 'indicate an upper-left direction.'
  1080. CALL mess
  1081. CALL mess 'IN ORDER TO STAY ALIVE you must NOT run out of energy, exceed'
  1082. CALL mess 'Stardate 5000.0, or be caught with your shields down.'
  1083. CALL mess
  1084. CALL mess 'The Enterprise will from time to time need maintenance. Do this'
  1085. CALL mess 'by pulling up next to a Starbase.'
  1086. CALL mess
  1087. OPTIONS PROMPT 'Hit [RETURN] to continue: '
  1088. PULL res
  1089. CALL mess CLS
  1090. justcleared = 'true'
  1091. return
  1092.  
  1093. /* ********************************************** */
  1094. /* ********************************************** */
  1095. /*           SUBROUTINE CAPTAINS_LOG              */
  1096. /*  PASSED VALUES - word2                         */
  1097. /* ********************************************** */
  1098. /* ********************************************** */
  1099.  
  1100. captains_log:
  1101.  
  1102. CALL mess 'Sorry, not implemented'
  1103.  
  1104. return
  1105.  
  1106. /* ********************************************** */
  1107. /* ********************************************** */
  1108. /*           SUBROUTINE LAUNCH_PROBE              */
  1109. /*  PASSED VALUES - word2                         */
  1110. /* ********************************************** */
  1111. /* ********************************************** */
  1112.  
  1113. launch_probe:
  1114.  
  1115. CALL mess 'Sorry, not implemented'
  1116.  
  1117. return
  1118.  
  1119. /* ********************************************** */
  1120. /* ********************************************** */
  1121. /*           SUBROUTINE COMPUTE                   */
  1122. /*  PASSED VALUES - word2                         */
  1123. /* ********************************************** */
  1124. /* ********************************************** */
  1125.  
  1126. compute:
  1127. CALL mess 'Sorry, not implemented'
  1128.  
  1129.  
  1130. return
  1131.  
  1132. /* ********************************************** */
  1133. /* ********************************************** */
  1134. /*           SUBROUTINE MISSION1                  */
  1135. /*  PASSED VALUES - none                          */
  1136. /* ********************************************** */
  1137. /* ********************************************** */
  1138.  
  1139. mission1:
  1140.  
  1141. /* make the Romulans active aggressors */
  1142. /* Mission 1 - WAR with the ROMULANS! */
  1143.  
  1144. /* Any Romulans in the sector? */
  1145. if map.x.y > 99 then do
  1146.   do i = 0 to 9     /* locate the Romulan in the quadrent */
  1147.    do j = 0 to 9
  1148.     if quad.i.j = 3 then
  1149.      do
  1150.       tx = i
  1151.       ty = j
  1152.      end
  1153.    end
  1154.   end
  1155.  
  1156.  /* got him - now move and fire */
  1157.  if tx > ex then t0 = -1
  1158.  if tx = ex then t0 = 0
  1159.  if tx < ex then t0 = 1
  1160.  if ty > ey then t1 = -1
  1161.  if ty = ey then t1 = 0
  1162.  if ty < ey then t1 = 1
  1163.  /* now how much? */
  1164.  factor = ((tx-ex)**2 + (ty-ey)**2)
  1165.  do i = 1 to 13 by .5
  1166.   tm = factor/i
  1167.   if tm < i then leave
  1168.  end
  1169.  factor = i%1
  1170.  /* now move him */
  1171.  
  1172. kl = 'yes'
  1173.  do i = 0 to factor - 1
  1174.   if factor < 1 then leave
  1175.   t2 = tx+t0
  1176.   t3 = ty+t1
  1177.   if t2 < 0 | t2 > 9 | t3 < 0 | t3 > 9 then leave
  1178.   space = quad.t2.t3
  1179.   if space = 1 then leave
  1180.   if space ~= 0 & kl = 'yes' then select
  1181.     when space = 2 then do
  1182.       CALL mess '*** ROMULAN COLLIDES with STAR ***'
  1183.       quad.tx.ty = 0
  1184.       map.x.y = map.x.y - 100
  1185.       kltot = kltot - 1
  1186.       kl = 'no'
  1187.      end
  1188.     when space = 3 then do
  1189.       CALL mess '*** ROMULAN COLLIDES with ROMULAN ***'
  1190.       quad.tx.ty = 0
  1191.       quad.t2.t3 = 0
  1192.       map.x.y = map.x.y - 200
  1193.       kltot = kltot - 2
  1194.       kl = 'no'
  1195.      end
  1196.     when space = 4 then do
  1197.       CALL mess '*** ROMULAN COLLIDES with BASE ***'
  1198.       quad.tx.ty = 0
  1199.       quad.t2.t3 = 0
  1200.       map.x.y = map.x.y - 100
  1201.       kltot = kltot - 1
  1202.       kl = 'no'
  1203.      end
  1204.     otherwise
  1205.      do
  1206.       CALL mess space
  1207.       CALL mess '*** ROMULAN EATEN FOR LUNCH! ***'
  1208.       points = points + 50
  1209.       quad.tx.ty = 0
  1210.       map.x.y = map.x.y - 100
  1211.       kltot = kltot - 1
  1212.       kl = 'no'
  1213.      end
  1214.    end
  1215.   if kl = 'yes' then do
  1216.     quad.tx.ty = 0
  1217.     quad.t2.t3 = 3
  1218.     tx = t2
  1219.     ty = t3
  1220. /*    CALL mess CLS   */ CALL mess HOM
  1221.  
  1222.     call print_quadrent
  1223.    end
  1224.  end
  1225. if docked = 'yes' then return
  1226. /* now fire */
  1227. if kl = 'yes' then do
  1228.   amount = klshields/5000 * random(100,500) * 10
  1229.   if amount > 1000 & shields = 'down' then do
  1230.    CALL mess '--- ROMULAN FIRES PHASERS ---'
  1231.    CALL mess '*** ENTERPRISE SHIELDS ARE DOWN ***'
  1232.    CALL mess '*** ENTERPRISE HIT with 'amount ' UNITS OF ENERGY ***'
  1233.    CALL mess '*** ENTERPRISE DESTROYED ***'
  1234.    alive = 'no'
  1235.   end
  1236.   if amount < 3000 & shields = 'UP' then do
  1237.    CALL mess '--- ROMULAN FIRES PHASERS ---'
  1238.    CALL mess '*** ENTERPRISE SHIELDS ARE UP ***'
  1239.    CALL mess '*** Shields absorb impact --- no damage ***'
  1240.    energy = energy - amount
  1241.   end
  1242.   if amount > 3000 & shields = 'UP' then do
  1243.    CALL mess '--- ROMULAN FIRES PHASERS ---'
  1244.    CALL mess '*** ENTERPRISE SHIELDS ARE UP ***'
  1245.    hit = amount - 3000
  1246.    CALL mess '*** ENTERPRISE HIT WITH' hit ' UNITS OF ENERGY ***'
  1247.    energy = energy - amount
  1248.    do i = 0 to hit/100
  1249.     call wear_and_tear
  1250.    end
  1251.   end
  1252.   if amount < 1001 & shields = 'down' then do
  1253.     CALL mess '--- ROMULAN FIRES PHASERS ---'
  1254.     CALL mess '*** ENTERPRISE SHIELDS ARE DOWN ***'
  1255.     hit = amount
  1256.     CALL mess '*** ENTERPRISE HIT WITH' hit ' UNITS OF ENERGY ***'
  1257.     do i = 0 to hit/100
  1258.      call wear_and_tear
  1259.     end
  1260.    end
  1261.   end
  1262. end
  1263.  
  1264. /* end for Romulans in sector ... if < 3 here go get some */
  1265.  
  1266. if map.x.y < 299 & alive = 'yes' then do
  1267.  found = 'no'
  1268.  
  1269.   do i = -1 to 1     /* locate a Romulan in the Galaxy */
  1270.    do j = -1 to 1
  1271.      tx = i+x
  1272.      ty = j+y
  1273.      if (tx > -1) & (tx < 10) & (ty > -1) & (ty < 10) then do
  1274.        if (map.tx.ty > 99) & ((i ~=0 )|(j ~=0 )) then do
  1275.          found = 'yes'
  1276.          i = 1
  1277.          j = 1
  1278.         end
  1279.       end
  1280.    end
  1281.   end
  1282. if found = 'yes' then do
  1283.   CALL mess 'CAPTAIN! A Romulan warship has just warped into the quadrant!'
  1284.   map.tx.ty = map.tx.ty - 100
  1285.   map.x.y = map.x.y + 100
  1286.   do until a = 1
  1287.    rx = random(0,9)
  1288.    ry = random(0,9)
  1289.    if quad.rx.ry = 0 then do
  1290.      quad.rx.ry = 3
  1291.      a = 1
  1292.     end
  1293.    else a = 0
  1294.   end
  1295.  end
  1296. end
  1297. if kltot = 0 then missstat = 'completed'
  1298. return
  1299.  
  1300. /* MISSION 2 */
  1301.  
  1302. init_variables_2:
  1303.  
  1304. return
  1305.  
  1306.  
  1307. mission2:
  1308.  
  1309. return
  1310.  
  1311. /* MISSION3 */
  1312.  
  1313. init_variables_3:
  1314.  
  1315. return
  1316.  
  1317. mission3:
  1318.  
  1319.  
  1320. /* MISSION4 */
  1321.  
  1322. init_variables_4:
  1323.  
  1324. return
  1325.  
  1326. mission4:
  1327.  
  1328.  
  1329. /* MISSION5 */
  1330.  
  1331. init_variables_5:
  1332.  
  1333. return
  1334.  
  1335. mission5:
  1336.  
  1337. /* MISSION6 */
  1338.  
  1339. init_variables_6:
  1340.  
  1341. return
  1342.  
  1343. mission6:
  1344.  
  1345. /* MISSION7 */
  1346.  
  1347. init_variables_7:
  1348.  
  1349. return
  1350.  
  1351. mission7:
  1352.  
  1353. /* MISSION8 */
  1354.  
  1355. init_variables_8:
  1356.  
  1357. return
  1358.  
  1359. mission8:
  1360.  
  1361. /* MISSION9 */
  1362.  
  1363. init_variables_9:
  1364.  
  1365. return
  1366.  
  1367. mission9:
  1368.  
  1369. return
  1370.  
  1371. old_highest:
  1372.  if ~Open(fnn,gamepath'HighScore','R') then return
  1373.  do i=1 to 10
  1374.   highname.i = Readln(fnn)
  1375.   highscore.i = Readln(fnn)
  1376.  end
  1377.  junk = Close(fnn)
  1378. return
  1379.  
  1380.  
  1381.  
  1382. new_highest:
  1383.  if UName = '' then return  /* saves from screwups from running offline */
  1384.  if points <= highscore.10 then return
  1385.  CALL mess 'CONGRATULATIONS!'
  1386.  CALL mess 'You are in the top 10! Saving your name and score for posterity...'
  1387.  highscore.10 = points
  1388.  highname.10 = UName
  1389.  do forever
  1390.    changes = 0
  1391.    do i = 1 to 9
  1392.     ihatearexx = i+1
  1393.     if highscore.ihatearexx > highscore.i then
  1394.      do
  1395.       temp = highscore.i
  1396.       tempname = highname.i
  1397.       highscore.i = highscore.ihatearexx          /* Bubblehead sort */
  1398.       highname.i = highname.ihatearexx
  1399.       highscore.ihatearexx = temp
  1400.       highname.ihatearexx = tempname
  1401.       changes = 1
  1402.      end
  1403.    end
  1404.    if changes = 0 then leave
  1405.  end
  1406.    if ~Open(fnn,gamepath'HighScore','W') then return
  1407.    do i = 1 to 10
  1408.      if Writeln(fnn,highname.i) < 1 then return
  1409.      if Writeln(fnn,highscore.i) < 1 then return
  1410.    end
  1411.    junk = Close(fnn)
  1412. return
  1413.  
  1414.  
  1415. clearbottom:
  1416.  CALL mess POS
  1417.  CALL mess CLR
  1418. return
  1419.  
  1420.  
  1421. BREAK_C:
  1422. toolong:
  1423. CALL mess ''
  1424. CALL mess 'Sorry, time up for this round.'
  1425. OPTIONS PROMPT 'Would you like to SAVE your game before exiting (Y/N)? '
  1426. PULL choice
  1427. if choice = 'Y' then call save_game
  1428. if points > highest then call new_highest
  1429. CALL mess 'Exiting STARTREK... play again soon!'
  1430. exit
  1431. return
  1432.  
  1433.  
  1434. mess:
  1435. PARSE ARG string
  1436. SAY string'0D'x
  1437. RETURN
  1438.  
  1439. /* end */
  1440.